package ru.app.entity;

/**
* Класс с типом файла *.aj для просмотра вызовов методов целевого класса Account
*/
public aspect AccountAspectWeaverAj {

    pointcut callWithDraw(int amount, Account account):
             call(boolean ru.app.entity.Account.withdraw(int)) && args(amount) && target(account);

    before(int amount, Account account) : callWithDraw(amount, account) {
        System.out.println("[AccountAspectWeaverAj.aj] Баланс счета перед выдачей: " + account.balance);
        System.out.println("[AccountAspectWeaverAj.aj] Требуется выдать: " + amount);
    }

    boolean around(int amount, Account account) : callWithDraw(amount, account) {
        if (account.balance < amount) {
            System.out.println("[AccountAspectWeaverAj.aj] Выдача отменена, недостаточно средств");
            return false;
        }
        return proceed(amount, account);
    }

    after(int amount, Account balance) : callWithDraw(amount, balance) {
        System.out.println("[AccountAspectWeaverAj.aj] Баланс после выдачи : " + balance.balance);
    }
}
